#include "rt_CMDProc.h"

int rt_CMDProc(XRt1553B *InstancePtr, B1553_BusService *pBusServ)
{
    u32 ret = 0, foo = 0;
    struct XRt1553B_MsgBlkDesc foo_cmd = {};                    // 临时存放当前消息
    struct XRt1553B_MsgBlkDesc *CMDInfo = &(pBusServ->cmdInfo); // 上次收到的消息
    ret = XRt1553B_GetCMDInfo(InstancePtr, &foo_cmd);

    if (ret == 0) // 无消息则返回
    {
        return 0;
    }

    if (CMDInfo->blk_err_stat != 0) // 消息错误 返回
    {
        pBusServ->ErrorState = CMDInfo->blk_err_stat;
        return -1;
    }

    // 判断当前消息是否与前一消息重复 避免AB总线消息处理两次
    foo = (foo_cmd.CMDWord) ^ (CMDInfo->CMDWord); // 按位异或为0表示相等
    foo = foo + ((foo_cmd.DataBlkPtr_or_ModeWord) ^ (CMDInfo->DataBlkPtr_or_ModeWord));
    foo = foo + ((CMDInfo->BUSA_or_BUSB) + (foo_cmd.BUSA_or_BUSB)); // AB总线判断
    if (foo == 1)                                                   // 消息完全相等 且仅属于AB总线 则函数返回0 不处理
    {
        return 0;
    }

    // 当前消息与前一条消息不一致 更新消息并处理
    memcpy(CMDInfo, &foo_cmd, sizeof(struct XRt1553B_MsgBlkDesc));

    // RT号为31 广播消息处理
    if (B1553_BCST_RTADDR == CMDInfo->RTaddr)
    {
        switch (CMDInfo->SubAddr_or_ModeCMD)
        {
        case B1553_POSALT_SUBADDR:               // 姿态定位广播
            if (1 == CMDInfo->CircBuff_rollover) // 循环缓冲回卷
            {
                ++pBusServ->MsgBcst_PosAlt_cnt;
            }
            else
            {
                ret = 0;
            }
            break;
        case B1553_DATATIME_SUBADDR: // 时间广播 接受时间并增加计数
            rt_RecvDateTime(InstancePtr, pBusServ);
            ++pBusServ->MsgBCST_DataTime_cnt;
            break;
        case B1553_MODECODE_SUBADDR: // 方式指令 广播
            rt_ModeCode_proc(InstancePtr, pBusServ);
            break;
        default:
            break;
        }
        // 消息处理完成 函数返回
        return ret;
    }

    // RT号不对 也不是广播 返回
    if (B1553_MY_RTADDR != CMDInfo->RTaddr)
    {
        return 0;
    }

    // RT号正确 根据子地址进行命令解析
    switch (CMDInfo->SubAddr_or_ModeCMD)
    {
    case B1553_DATAWRAP_SUBADDR:  // 数据卷绕
        if (CMDInfo->T_or_R == 1) // 发送后计数
        {
            pBusServ->Msg_DataWrap_cnt++;
        }
        else // 接收时 不处理
        {
            ret = 0;
        }
        break;
    case B1553_ACQTRANS_SUBADDR: // 获取传输
        rt_AcqTrans_proc(InstancePtr, CMDInfo, pBusServ);
        ret = 0;
        break;
    case B1553_DISTRBTRANS_SUBADDR: // 分发传输
        rt_DistrbTrans_proc(InstancePtr, CMDInfo, pBusServ);
        ret = 0;
        break;

    default:
        ret = 0;
        break;
    }

    return ret;
}